package edu.main;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Date;
import java.util.List;

import edu.account.BillManager;
import edu.account.Categoria;
import edu.account.Credito;
import edu.account.Despesa;
import edu.account.DespesaRecorrente;
import edu.dao.AccountDAO;
import edu.dao.LembreteDAO;
import edu.dao.UsuarioDAO;
import edu.exception.DadosInvalidosException;
import edu.exception.FileNotSupportedException;
import edu.exception.RegisterException;
import edu.exception.ResourceException;
import edu.reminder.Reminder;
import edu.users.Register;

public class Facade {
	
	private BillManager manager;
	private Register register;
	private Reminder reminder;
	
	public void cadastrarUsuario(String nome, String login, String senha) throws RegisterException, DadosInvalidosException{
		register.cadastrarUsuario(nome, login, senha);
	}
	
	public void removerUsuario(String login, String senha) throws RegisterException{
		register.removerUsuario(login, senha);
	}
	
	public void alterarUsuario(String login, String senhaAntiga, String nomeNovo, String senhaNova) throws RegisterException, DadosInvalidosException{
		register.alterarUsuario(login,senhaAntiga, nomeNovo, senhaNova);
	}
	
	public void login(String login, String senha) throws RegisterException{
		register.login(login, senha);
	}
	
	public void logoff(String login, String senha) throws RegisterException{
		register.logoff(login, senha);
	}
	
	public String getNomeUsuario(String login, String senha) throws RegisterException{
		return register.getNomeUsuario(login,senha);
	}
	
	public long addCredit(String login, String descricao, double valor, String website, String telefone, Date dataEntrada) throws DadosInvalidosException, ResourceException{
		return manager.addCredit(login, descricao, valor, website, telefone, dataEntrada);
	}
	
	public boolean changeCredit(String login,long identificador, String descricao, double valor, String website, String telefone, Date dataEntrada) throws DadosInvalidosException, ResourceException{
		return manager.changeCredit(login, identificador, descricao, valor, website, telefone, dataEntrada);
	}
	
	public boolean removeCredit(String login,long identificador) throws ResourceException{
		return manager.removeCredit(login, identificador);
	}
	
	public List<Credito> getCreditos(String login, Date dataInicial, Date dataFinal){
		return manager.getCreditos(login, dataInicial, dataFinal);
	}
	
	public Credito getCredito(String login, long identificador){
		return manager.getCredito(login, identificador);
	}
	
	/**
	 * Despesa com pagamento
	 * @throws ResourceException 
	 */
	public long addExpense(String login, String descricao, double valor, String website, String telefone, 
			Date dataPagamento, Date dataVencimento, boolean isPago, String categoria) throws DadosInvalidosException, ResourceException {
		return manager.addExpense(login, descricao, valor, website, telefone, dataPagamento, dataVencimento, isPago, Categoria.valueOf(categoria));
	}
	/**
	 * Despesa sem pagamento
	 * @throws ResourceException 
	 */
	public long addExpense(String login, String descricao, double valor, String website, String telefone, 
			Date dataVencimento, String categoria) throws DadosInvalidosException, ResourceException {
		return manager.addExpense(login, descricao, valor, website, telefone, dataVencimento, Categoria.valueOf(categoria));
	}
	
	public List<DespesaRecorrente> addRecurringExpense(String login, String descricao, double valor, String website, String telefone, 
			Date dataVencimento, String categoria, int qtdeRepeticao) throws DadosInvalidosException, ResourceException, RegisterException {
		return manager.addRecurringExpense(login, descricao, valor, website, telefone, dataVencimento, Categoria.valueOf(categoria), qtdeRepeticao);
	}
	
	public boolean changeExpense(String login, long identificador, String descricao, double valor, String website, String telefone, Date dataEntrada, String categoria) throws DadosInvalidosException, ResourceException{
		return manager.changeExpense(login, identificador, descricao, valor, website, telefone, dataEntrada, Categoria.valueOf(categoria));
	}
	
	public boolean removeExpense(String login, long identificador) throws ResourceException{
		return manager.removeExpense(login, identificador);
	}
	
	public List<Despesa> getExpenses(String login, Date dataInicial, Date dataFinal){
		return manager.getExpenses(login, dataInicial, dataFinal);
	}
	
	public Despesa getExpense(String login, long identificador){
		return manager.getExpense(login, identificador);
	}
	
	public boolean efetuarPagamento(String login, long identificador, Date dataPagamento){ 
		return manager.efetuarPagamento(login, identificador, dataPagamento);
	}
	
	public void limparDados(){
		new UsuarioDAO().gerarTabelas();
		new AccountDAO().gerarTabelas();
		LembreteDAO.gerarTabelas();
		manager = new BillManager();
		register = manager.getRegister();
		reminder = new Reminder();
	}
	
	public void getRelatorio(String login, Date dataInicial, Date dataFinal, String filename) throws IOException, RegisterException{
		manager.getRelatorio(login, dataInicial, dataFinal, filename);
	}
	
	
	public int importar(String login, String fileName) throws FileNotFoundException, FileNotSupportedException {
		return manager.importar(login, fileName).size();
	}
	
	public void setDespesaNotificavel(String login, long id,int qtdNotificacoes) throws RegisterException, DadosInvalidosException, ResourceException{
		manager.setDespesaNotificavel(login, id, qtdNotificacoes);
	}
	
	public String remindeMe(String login, Date data){
		return reminder.notificar(login, data);
	}
}